<?php
/**
 * 工具类：
 * 收集一些常用的工具方法
 * @author Taoke
 *
 */
class Tools {
    public static $lngLatUrl = 'http://api.map.baidu.com/geocoder/v2/';
    public static $ak = '4FUeXHyx6hqmnFPP7SnHVLpE';

    /**
     * 百度地图API，通过省份/城市/区县 获取对应地址的经纬度
     * @param string $city 省份/城市/区县
     * @param string $address 省份/城市/区县或更详细的地址
     * @author: Taoke
     * @date: 2015年12月18日下午3:04:40
     */
    public static function lngLat($address,$city = '') {
        $res = json_decode(file_get_contents(self::$lngLatUrl."?ak=".self::$ak."&output=json&address=".urlencode($address)."&city=".urlencode($city)));
        if ($res->status == 0) {
            return $res->result->location;
        }
        return false;
    }
    
    /**
     * 获取给定日期的前一天
     * @param string $date
     * @return string $yesterday
     * @author: taoke
     * @date: 2015年5月27日下午1:56:56
     */
    public static function getYesterday($date) {
        if(empty($date)) {
            $yesterday = date("Y-m-d",strtotime("-1 day"));
        }else{
            $arr = explode('-', $date);
            $year = $arr[0];
            $month = $arr[1];
            $day = $arr[2];
            $unixtime = mktime(0,0,0,$month,$day,$year)-86400;
            $yesterday = date('Y-m-d',$unixtime);
        }
        return $yesterday;
    }
    
    /**
     * 二维数组排序
     * @param array $multi_array 需要排序的数组
     * @param string $sort_key 以该键进行排序
     * @param string $sort 排序方式 SORT_ASC/SORT_DESC
     * @author: Taoke
     * @date: 2015年8月4日上午11:30:18
     */
    public static function multiArraySort($multi_array,$sort_key,$sort=SORT_ASC){
        if(is_array($multi_array)){
            foreach ($multi_array as $row_array){
                if(is_array($row_array)){
                    $key_array[] = $row_array[$sort_key];
                }else{
                    return false;
                }
            }
        }else{
            return false;
        }
        array_multisort($key_array,$sort,$multi_array);
        return $multi_array;
    }
    
    /**
     * 字符串截取函数，防止截取中文乱码
     * @param String $sourcestr 截取的字符串对象
     * @param Integer $cutlength 截取的长度
     * @param String $etc 截取完的后缀，默认为'...'
     * @author Taoke
     * @date: 2016年1月15日17:08:38
     */
    public static function tSub($sourcestr, $cutlength = 80, $etc = '...') {
        $returnstr = '';
        $i = 0;
        $n = 0.0;
        $str_length = strlen($sourcestr);
        while ( ($n<$cutlength) and ($i<$str_length) ) {
            $temp_str = substr($sourcestr, $i, 1);
            $ascnum = ord($temp_str);
            if ( $ascnum >= 252) {
                $returnstr = $returnstr . substr($sourcestr, $i, 6);
                $i = $i + 6;
                $n++;
            } elseif ( $ascnum >= 248 ) {
                $returnstr = $returnstr . substr($sourcestr, $i, 5);
                $i = $i + 5;
                $n++;
            } elseif ( $ascnum >= 240 ) {
                $returnstr = $returnstr . substr($sourcestr, $i, 4);
                $i = $i + 4;
                $n++;
            } elseif ( $ascnum >= 224 ) {
                $returnstr = $returnstr . substr($sourcestr, $i, 3);
                $i = $i + 3 ;
                $n++;
            } elseif ( $ascnum >= 192 ) {
                $returnstr = $returnstr . substr($sourcestr, $i, 2);
                $i = $i + 2;
                $n++;
            } elseif ( $ascnum>=65 and $ascnum<=90 and $ascnum!=73) {
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1;
                $n++;
            } elseif ( !(array_search($ascnum, array(37, 38, 64, 109 ,119)) === FALSE) ) {
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1;
                $n++;
            } else {
                $returnstr = $returnstr . substr($sourcestr, $i, 1);
                $i = $i + 1;
                $n = $n + 0.5;
            }
        }
    
        if ( $i < $str_length ) {
            $returnstr = $returnstr . $etc;
        }
    
        return $returnstr;
    }
    
    /**
     * 使用curl获取接口数据
     * @param unknown $url  URL地址
     * @param unknown $data 参数
     * @return mixed
     * @author: Taoke
     * @date: 2015年8月13日下午2:11:24
     */
    public static function curl($url,$data) {
        $ch = curl_init ();
    
        curl_setopt ( $ch, CURLOPT_URL, $url );
        curl_setopt ( $ch, CURLOPT_POST, 1 );
        curl_setopt ( $ch, CURLOPT_HEADER, 0 );
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
        $return = curl_exec ( $ch );
        curl_close ( $ch );
        return $return;
    }
    
    /**
     * 获取用户的真实IP
     * @return 返回IP $onlineip
     * @author: Taoke
     * @date: 2015年8月13日下午2:11:24
     */
    public static function getIp() {
        $onlineip='';
        if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){
            $onlineip=getenv('HTTP_CLIENT_IP');
        } elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){
            $onlineip=getenv('HTTP_X_FORWARDED_FOR');
        } elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){
            $onlineip=getenv('REMOTE_ADDR');
        } elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){
            $onlineip=$_SERVER['REMOTE_ADDR'];
        }
        return $onlineip;
    }
    
    /**
     * 封装file_get_contents 方法
     * @param string $url 请求地址
     * @param string $method 请求方法
     * @param int $timeout 超时时间
     * @author: taoke
     * @date: 2015年8月13日下午3:00:58
     */
    public static function fileGetContents($url, $method = 'GET', $timeout) {
        $opts = [
            'http' => [
                'method' => $method,
                'timeout' => $timeout,
            ]
        ];
        $context = stream_context_create($opts);
        return @file_get_contents($url, false, $context);
    }
    
    /**
     * 计算两个日期相隔多少天
     * @param 起始日期 $time1
     * @param 结束日期 $time2
     * @author: taoke
     * @date: 2016年1月15日17:11:32
     */
    public static function timeInterval($time1, $time2) {
        $time1 = is_numeric($time1) ? $time1 : strtotime($time1);
        $time2 = is_numeric($time2) ? $time2 : strtotime($time2);
        $day = (int) (($time1 - $time2) / (3600 * 24));
        return abs($day);
    }
    
    /**
     * 根据时间戳获取星期
     * @param string $date 字符串时间戳
     * @return string
     * @author: Taoke
     * @date: 2016年1月12日下午2:34:08
     */
    public static function getChinaWeek($date) {
        $weekarray = ["日","一","二","三","四","五","六"];
        return "星期".$weekarray[date("w", $date)];
    }
    
    /**
     * 判读用户是否手机登录
     * @return boolean
     * @author: Taoke
     * @date: 2016年1月15日17:15:52
     */
    public static function isMobile() {
        //最后区分ipad和移动端
        if(isset($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'ipad'))
        {
            return false;
        }
    
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
        if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return true;
        }
        //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        if (isset ($_SERVER['HTTP_VIA'])) {
            //找不到为flase,否则为true
            return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
        }
        //脑残法，判断手机发送的客户端标志,兼容性有待提高
        if (isset ($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = [
                    'nokia','sony','ericsson','mot','samsung',
                    'htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel',
                    'lenovo','iphone','ipod','blackberry','meizu','android','netfront',
                    'symbian','ucweb','windowsce','palm','operamini','operamobi','openwave',
                    'nexusone','cldc','midp','wap','mobile'
            ];
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return true;
            }
    
        }
        //协议法，因为有可能不准确，放到最后判断
        if (isset ($_SERVER['HTTP_ACCEPT'])) {
            // 如果只支持wml并且不支持html那一定是移动设备
            // 如果支持wml和html但是wml在html之前则是移动设备
            if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
                return true;
            }
        }
    
        return false;
    }
    
    /**
     * 递归创建目录
     * @Title: tMkdirs
     * @return: boolean
     * @author: Taoke
     * @date: 2016年1月15日17:17:51
     */
    public static function tMkdirs($dir) {
        if(!is_dir($dir))
        {
            if(!tMkdirs(dirname($dir))){
                return false;
            }
            if(!mkdir($dir,0777)){
                return false;
            }
        }
        return true;
    }
    
    /**
     * 数字转换为中文
     * @param  string|integer|float  $num  目标数字
     * @param  integer $mode 模式[true:金额（默认）,false:普通数字表示]
     * @param  boolean $sim 使用小写（默认）
     * @return string
     * @author: Taoke
     * @date: 2016年1月15日17:17:51
     */
    public static function numberTochinese($num,$mode = true,$sim = true) {
        if(!is_numeric($num)) {
            return '含有非数字非小数点字符！';
        }
    
        $char = $sim ? array('零','一','二','三','四','五','六','七','八','九')
        : array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
    
        $unit = $sim ? array('','十','百','千','','万','亿','兆')
        : array('','拾','佰','仟','','萬','億','兆');
    
        $retval  = $mode ? '元':'点';
    
        //小数部分
        if(strpos($num, '.')) {
            list($num,$dec) = explode('.', $num);
            //$dec = strval(round($dec,2)); 
            if($mode) {
                $retval .= "{$char[$dec['0']]}角{$char[$dec['1']]}分";
            }else {
                for($i = 0,$c = strlen($dec);$i < $c;$i++) {
                    $retval .= $char[$dec[$i]];
                }
            }
        }
    
        //整数部分
        $str = $mode ? strrev(intval($num)) : strrev($num);

        for($i = 0,$c = strlen($str);$i < $c;$i++) {
            $out[$i] = $char[$str[$i]];
            if($mode) {
                $out[$i] .= $str[$i] != '0'? $unit[$i%4] : '';
                 
                if($i>1 and $str[$i]+$str[$i-1] == 0) {
                    $out[$i] = '';
                }
                 
                if($i%4 == 0) {
                    $out[$i] .= $unit[4+floor($i/4)];
                }
            }
        }
         
        $retval = join('',array_reverse($out)) . $retval;
        return $retval;
    }


    //获取指定字符串中间的内容
    //eg:$str = "问题发布成功：165 共发布答案数：0 失败数：0";
    //echo GetBetween($str,"问题发布成功："," 共发布答案数");
    //输出：165
    public static function stringCutCenterStr($str,$start,$end) {
        $r = explode($start, $str);
        if (isset($r[1])){
            $r = explode($end, $r[1]);
            return $r[0];
        }
        return '';
    }
}